package io.summer.basis.enums;

import io.summer.basis.api.ApiResponse;

import java.util.Objects;

/**
 * @author Moonlight
 */
public interface IEnumCode {
  /**
   * 成功
   */
  int SUCCESS = 0;

  /**
   * 服务器内部错误
   */
  int SERVER_ERROR = 500;

  /**
   * 框架起始错误码
   */
  int FRAME_ERROR = 1000;

  /**
   * 业务逻辑错误起始错误码
   */
  int BIZ_ERROR = 10000;

  /**
   * 获取枚举标识
   *
   * @return
   */
  int getCode();

  /**
   * 获取枚举描述
   *
   * @return
   */
  String getMessage();

  /**
   * 通过枚举类型和code值获取对应的枚举类型
   *
   * @param enumType
   * @param code
   * @param <T>
   * @return
   */
  static <T extends IEnumCode> T valueOf(Class<T> enumType, int code) {
    Objects.requireNonNull(enumType);
    T[] enumConstants = enumType.getEnumConstants();
    if (enumConstants == null) {
      return null;
    }
    for (T e : enumConstants) {
      if (e.getCode() == code) {
        return e;
      }
    }
    return null;
  }

  /**
   * convert to ApiResponse
   * @param <T> any response type
   * @return ApiResponse<T>
   */
  default <T> ApiResponse<T> toApiResponse() {
    return ApiResponse.response(this);
  }

  /**
   * convert to ApiResponse
   * @param <T> any response type
   * @param params format params
   * @return ApiResponse<T>
   */
  default <T> ApiResponse<T> toApiResponse(Object... params) {
    return ApiResponse.response(null, this, params);
  }
}
